From: Jan Beulich Date: Wed, 26 Apr 2017 07:48:45 +0000 (+0200) Subject: x86/32on64: properly honor add-to-physmap-batch's size X-Git-Tag: archive/raspbian/4.11.1-1+rpi1~1^2~66^2~2192 X-Git-Url: https://dgit.raspbian.org/%22http:/www.example.com/cgi/%22https://%22%22/%22http:/www.example.com/cgi/%22https:/%22%22?a=commitdiff_plain;h=144aec4140515c53bb1676df71a469f3e285c557;p=xen.git x86/32on64: properly honor add-to-physmap-batch's size Commit 407a3c00ff ("compat/memory: fix build with old gcc") "fixed" a build issue by switching to the use of uninitialized data. Due to - the bounding of the uninitialized data item - the accessed area being outside of Xen space - arguments being properly verified by the native hypercall function this is not a security issue. Reported-by: Marek Marczykowski-Górecki Signed-off-by: Jan Beulich Reviewed-by: Wei Liu Reviewed-by: Andrew Cooper Release-acked-by: Julien Grall --- diff --git a/xen/common/compat/memory.c b/xen/common/compat/memory.c index a37a948331..35bb259808 100644 --- a/xen/common/compat/memory.c +++ b/xen/common/compat/memory.c @@ -251,7 +251,7 @@ int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) compat) unsigned int limit = (COMPAT_ARG_XLAT_SIZE - sizeof(*nat.atpb)) / (sizeof(nat.atpb->idxs.p) + sizeof(nat.atpb->gpfns.p)); /* Use an intermediate variable to suppress warnings on old gcc: */ - unsigned int size = cmp.atpb.size; + unsigned int size; xen_ulong_t *idxs = (void *)(nat.atpb + 1); xen_pfn_t *gpfns = (void *)(idxs + limit); /* @@ -262,8 +262,10 @@ int compat_memory_op(unsigned int cmd, XEN_GUEST_HANDLE_PARAM(void) compat) enum XLAT_add_to_physmap_batch_u u = XLAT_add_to_physmap_batch_u_res0; - if ( copy_from_guest(&cmp.atpb, compat, 1) || - !compat_handle_okay(cmp.atpb.idxs, size) || + if ( copy_from_guest(&cmp.atpb, compat, 1) ) + return -EFAULT; + size = cmp.atpb.size; + if ( !compat_handle_okay(cmp.atpb.idxs, size) || !compat_handle_okay(cmp.atpb.gpfns, size) || !compat_handle_okay(cmp.atpb.errs, size) ) return -EFAULT;